package com.yy.sso.common.vo;

import com.yy.sso.common.constants.HttpStatusCodeConstant;
import lombok.Data;

import java.io.Serializable;

/**
 * 响应实体
 * @param <T>
 */
@Data
public class Result<T> implements Serializable {
    private static final long serialVersionUID = 3256854714048319976L;

    private Integer code;

    private String message;

    private transient T data;

    /**
     * 适用于无返回值的情况:如增-删-改
     *
     * @param message 消息
     * @param <T>     泛型类型
     * @return
     */
    public static <T> Result<T> ok(String message) {
        Result<T> result = new Result<>();
        result.setCode(HttpStatusCodeConstant.HTTP_CODE_SUCCESS);
        result.setMessage(message);
        return result;
    }

    /**
     * 适合查询，直接返回数据
     *
     * @param data 返回数据
     * @param <T>  泛型数据
     * @return
     */
    public static <T> Result<T> ok(T data) {
        Result<T> result = new Result<>();
        result.setCode(HttpStatusCodeConstant.HTTP_CODE_SUCCESS);
        result.setMessage("操作成功");
        result.setData(data);
        return result;
    }

    /**
     * 适用于有返回值的情况：查询
     *
     * @param message 消息
     * @param data    返回数据信息
     * @param <T>     泛型数据
     * @return
     */
    public static <T> Result<T> ok(String message, T data) {
        Result<T> result = new Result<>();
        result.setCode(HttpStatusCodeConstant.HTTP_CODE_SUCCESS);
        result.setMessage(message);
        result.setData(data);
        return result;
    }

    /**
     * 无参异常情况
     *
     * @param <T> 泛型数据
     * @return
     */
    public static <T> Result<T> error() {
        Result<T> result = new Result<>();
        result.setCode(HttpStatusCodeConstant.HTTP_CODE_ERROR);
        result.setMessage("未知异常，请联系管理员");
        return result;
    }

    /**
     * 自定义异常信息的情况
     *
     * @param message
     * @param <T>     泛型数据
     * @return
     */
    public static <T> Result<T> error(String message) {
        Result<T> result = new Result<>();
        result.setCode(HttpStatusCodeConstant.HTTP_CODE_ERROR);
        result.setMessage(message);
        return result;
    }

    /**
     * 自定义code和message的情况
     *
     * @param code
     * @param message
     * @param <T>     泛型数据
     * @return
     */
    public static <T> Result<T> error(Integer code, String message) {
        Result<T> result = new Result<>();
        result.setCode(code);
        result.setMessage(message);
        return result;
    }
}
